package basicservicelogic

import (
	"context"
	"fmt"
	"github.com/zeromicro/go-zero/core/logx"
	"property_service/dao/model"
	"property_service/dao/query"
	"property_service/internal/svc"
	"property_service/property_service"
	"time"
)

type GetNoLogic struct {
	ctx    context.Context
	svcCtx *svc.ServiceContext
	logx.Logger
}

func NewGetNoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetNoLogic {
	return &GetNoLogic{
		ctx:    ctx,
		svcCtx: svcCtx,
		Logger: logx.WithContext(ctx),
	}
}

// GetNo 通过指定消息生成数据
func (l *GetNoLogic) GetNo(in *property_service.DeviceParameterConfigby) (*property_service.ResponseStr, error) {
	// 定义一个设备参数配置模型对象切片用于存储查询结果
	var data *model.DeviceParameterConfig
	DB := l.svcCtx.Gorm
	// 获取设备参数配置模型的查询构造器
	m := query.Use(l.svcCtx.Gorm).DeviceParameterConfig
	// 构建查询条件：根据租户ID查询
	do := m.WithContext(l.ctx).Where(m.TenantID.Eq(in.TenantID)) // 租户ID
	if in.ParamCode != "" {
		do = do.Where(m.ParamCode.Eq(in.ParamCode))
	}
	data, _ = do.First()
	if data == nil {
		return &property_service.ResponseStr{
			Str:     "null",
			Code:    404,
			Message: "未找到指定单号规则",
		}, nil
	}
	fmt.Print("data:	" + data.SettingFlag) //通过消息来判断
	//1前缀 + 年月 + 流水号, 2前缀 +年月日 + 流水号以日为小结, 3前缀 + 科室编号 + 年 + 流水号 ，4前缀 + 仓库编号 + 年 + 流水号
	if data.SettingFlag != "" {
		//获取后的单号
		Number := ""
		//判断是否有时间
		currentTime := time.Now()

		//通过当前账套以及单号字段进行查询
		sql := fmt.Sprintf("SELECT count(*)+1 FROM %s WHERE tenant_id = ? AND %s LIKE ?", data.ParamCode, in.Zdm)
		//判断用户的是什么规则
		if data.SettingFlag == "1" {
			// 1 前缀 + 年月 + 流水号
			lsh := data.ValueCode + currentTime.Format("200601")
			var no int
			DB.Raw(sql, in.TenantID, lsh+"%").Scan(&no)
			//判断数值是否小于10，小于10加上前缀
			var sz string
			if no < 10 {
				sz = fmt.Sprintf("%s%d", "0", no)
			}
			Number = fmt.Sprintf("%s%s%s", data.ValueCode, currentTime.Format("200601"), sz)
		} else if data.SettingFlag == "2" {
			// 2 前缀 +年月日 + 流水号以日为小结
			lsh := data.ValueCode + currentTime.Format("20060102")
			var no int
			sql = fmt.Sprintf("%s and  DATE(%s) = ?", sql, in.DateZdm)
			fmt.Println("sql			:", sql)
			DB.Raw(sql, in.TenantID, lsh+"%", currentTime.Format("2006-01-02")).Scan(&no)
			//判断数值是否小于10，小于10加上前缀
			var sz string
			if no < 10 {
				sz = fmt.Sprintf("%s%d", "0", no)
			}
			Number = fmt.Sprintf("%s%s%s", data.ValueCode, currentTime.Format("20060102"), sz)
		} else if data.SettingFlag == "3" {
			// 3 前缀 + 科室编号 + 年 + 流水号 以科室为单位，每个科室从1开始
			lsh := data.ValueCode + in.DepartmentId + currentTime.Format("2006")
			var no int
			sql = fmt.Sprintf("%s and  %s = ?", sql, in.DepartmentZdm)
			DB.Raw(sql, in.TenantID, lsh+"%", in.DepartmentId).Scan(&no)
			//判断数值是否小于10，小于10加上前缀
			var sz string
			if no < 10 {
				sz = fmt.Sprintf("%s%d", "0", no)
			}
			Number = fmt.Sprintf("%s%s%s%s", data.ValueCode, in.DepartmentId, currentTime.Format("2006"), sz)
		} else if data.SettingFlag == "4" {
			// 4 前缀 + 仓库编号 + 年 + 流水号 以仓库为单位，每个仓库从1开始
			lsh := data.ValueCode + in.StockId + currentTime.Format("2006")
			var no int
			sql = fmt.Sprintf("%s and  stock_id = ?", sql)
			DB.Raw(sql, in.TenantID, lsh+"%", in.StockId).Scan(&no)
			//判断数值是否小于10，小于10加上前缀
			var sz string
			if no < 10 {
				sz = fmt.Sprintf("%s%d", "0", no)
			}
			Number = fmt.Sprintf("%s%s%s%s", data.ValueCode, in.StockId, currentTime.Format("2006"), sz)

		}
		return &property_service.ResponseStr{
			Str:     Number,
			Code:    200,
			Message: "单号生成成功",
		}, nil
	} else {
		return &property_service.ResponseStr{
			Str:     "str",
			Code:    404,
			Message: "请配置单号",
		}, nil
	}

	return &property_service.ResponseStr{}, nil
}

// 在 FiVoucherTemplateAddLogic 结构体中添加辅助方法
func (l *GetNoLogic) buildResponse(str string, res *property_service.Response, err error) (*property_service.ResponseStr, error) {
	return &property_service.ResponseStr{
		Str:     str,
		Code:    res.Code,
		Message: res.Message,
	}, err
}
